from PyQt4 import QtCore, QtGui
from PyQt4.Qt import *
from vue import IFenetrePrincipale, IFenetreInfosPlacement, IFenetreChargement, IFenetreInfosParking, IFenetreContrats, IFenetreDdeAbo, IFenetreStats, IFenetreMerci, IFenetrePayer, IFenetrePaiement, IFenetreDdeImmatriculation, IFenetreAjoutClient, IFenetrePresentationCarte, IFenetreDdeSuperAbo, IFenetreInfo
from pickle import ADDITEMS
from random import randint
from controleur import CtrlBdd
import time, sys

class CtrlInterface(QWidget):
    
    def __init__(self, ctrlPark):
        self.ctrlPark = ctrlPark
        QWidget.__init__(self)
        self.fenPrincipale=QMainWindow()
        self.ui1 = IFenetrePrincipale.Ui_DreamPark()
        self.ui1.setupUi(self.fenPrincipale)
        self.ui1.toolButtonExit.setShortcut('Ctrl+Q')
        self.ui1.toolButtonExit.clicked.connect(QtGui.qApp.quit)
        self.ui1.toolButtonPark.clicked.connect(self.infosParking)
        
        self.fenDdeAbo=QWidget()
        self.ui2 = IFenetreDdeAbo.Ui_DdeAbonnement()
        self.ui2.setupUi(self.fenDdeAbo)
        self.ui2.boutonNon.clicked.connect(self.neVeutPasAbo)
        self.ui2.boutonOui.clicked.connect(self.addAbo)
        
        self.fenDdeImmat=QWidget()
        self.ui3 = IFenetreDdeImmatriculation.Ui_Immat()
        self.ui3.setupUi(self.fenDdeImmat)
        self.ui3.boutonContinuer.clicked.connect(self.addVoiture)
        
        self.fenAjoutClient=QWidget()
        self.ui4 = IFenetreAjoutClient.Ui_Form()
        self.ui4.setupUi(self.fenAjoutClient)
        self.ui4.boutonTerminerAbonnement.clicked.connect(self.addClient)
        self.ui4.btnEffacer.clicked.connect(self.effacerChampsClient)
        
        self.fenInsererCarte=QWidget()
        self.ui5 = IFenetrePresentationCarte.Ui_PresCarte()
        self.ui5.setupUi(self.fenInsererCarte)
        self.ui5.boutonCarte.clicked.connect(self.insererCarte)
        
        self.fenDdeSuperAbo=QWidget()
        self.ui6 = IFenetreDdeSuperAbo.Ui_DdeSuperAbonnement()
        self.ui6.setupUi(self.fenDdeSuperAbo)
        self.ui6.boutonNon.clicked.connect(self.neVeutPasSuperAbo)
        self.ui6.boutonOui.clicked.connect(self.addSuperAbo)
        
        self.fenInfos=QWidget()
        self.ui7 = IFenetreInfo.Ui_recapitulatif()
        self.ui7.setupUi(self.fenInfos)
        self.ui7.boutonTerminer.clicked.connect(self.fenInfos.close)
        
        self.fenStat=QWidget()
        self.ui8 = IFenetreStats.Ui_stat()
        self.ui8.setupUi(self.fenStat)
        self.ui8.boutonTerminer.clicked.connect(self.fenStat.close)
        self.ui8.btnActualise.clicked.connect(self.actualiserFreq)
        
        self.fenChoixPaiement=QWidget()
        self.ui9 = IFenetrePaiement.Ui_paiement()
        self.ui9.setupUi(self.fenChoixPaiement)
        self.ui9.btnCb.clicked.connect(self.addTypePaiementCb)
        self.ui9.btnEspeces.clicked.connect(self.addTypePaiementEspeces)
        
        self.fenPayer=QWidget()
        self.ui10 = IFenetrePayer.Ui_fenetrePayer()
        self.ui10.setupUi(self.fenPayer)
        self.ui10.btnPayer.clicked.connect(self.sortirVoiture)
        
        self.fenMerci=QWidget()
        self.ui11 = IFenetreMerci.Ui_fenetreFinale()
        self.ui11.setupUi(self.fenMerci)
        self.ui11.btnFermer.clicked.connect(self.fenMerci.close)
        
        self.fenInfosPark=QWidget()
        self.ui12 = IFenetreInfosParking.Ui_InfosPark()
        self.ui12.setupUi(self.fenInfosPark)
        self.ui12.boutonTerminer.clicked.connect(self.fenInfosPark.close)
        
        self.fenContrats=QWidget()
        self.ui13 = IFenetreContrats.Ui_contrats()
        self.ui13.setupUi(self.fenContrats)
        self.ui13.boutonTerminer.clicked.connect(self.fenContrats.close) 
        self.ui13.btnActualise.clicked.connect(self.actualiserContrats)
        
        self.fenInfosPlacements=QWidget()
        self.ui14 = IFenetreInfosPlacement.Ui_InfosPlacement()
        self.ui14.setupUi(self.fenInfosPlacements)
        self.ui14.boutonTerminer.clicked.connect(self.fenInfosPlacements.close) 
        self.ui14.btnActualise.clicked.connect(self.actualiserInfosPlacement)
        
        self.barreChargement = IFenetreChargement.Chargement()
        self.iniFenPrincipale()   
        self.voitureEnCours = -1
        self.accesEnCours = 1
        self.questionsTerminees = False
        self.typePaiementRenseigne = False        
        
        
    def iniFenPrincipale(self):
        self.fenPrincipale.show()      
        self.ui1.statutBarFenetrePrincipale.showMessage("Projet Python L3 : TOROND Damien - SENTOST Geoffrey")
        self.ui1.statutBarFenetrePrincipale.setEnabled(False)
        self.maj()
        self.ui1.listeVoitures.currentItemChanged.connect(self.assignerVoitureSelect)
        self.ui1.boutonGarerVoiture.clicked.connect(self.garerVoiture)
        self.ui1.boutonReprendreVoiture.clicked.connect(self.payer)
        self.ui1.boutonInfos.clicked.connect(self.infosVoiture)
        self.ui1.boutonDeselect.clicked.connect(self.deselect)
        self.ui1.actionVueFrequentations.triggered.connect(self.ouvrirStats)
        self.ui1.actionVueContrats.triggered.connect(self.ouvrirContrats)
        self.ui1.actionOuvrir.triggered.connect(self.ouvrirBdd)
        self.ui1.actionVuePlacements.triggered.connect(self.ouvrirInfosPlacements)
        self.ui1.actionEditionPlacements.triggered.connect(self.exporterInfosPlacement)
        self.ui1.actionEditionFrequentations.triggered.connect(self.exporterInfosFrequentations)
        self.ui1.actionEditionContrats.triggered.connect(self.exporterInfosContrats)
        self.ui1.actionReinit.triggered.connect(self.reinitialiserBdd)
        self.ui1.actionNouveau.triggered.connect(self.nouvelleBdd)
        self.ui1.actionVersion.triggered.connect(self.renseignerVersion)
        self.ui1.actionDreamPark.triggered.connect(self.renseignerDreamPark)
        self.ctrlPark.getAcces(1).borneTicket.getEcran().setPrintWriter(self.ui1.listeAffichage)
        self.ctrlPark.getAcces(2).borneTicket.getEcran().setPrintWriter(self.ui1.listeAffichage_2)
        
    def assignerVoitureSelect(self):
        self.voitureEnCours = self.ui1.listeVoitures.currentRow()
        self.ui1.boutonReprendreVoiture.setEnabled(True)
        self.ui1.boutonInfos.setEnabled(True)
        self.ui1.boutonDeselect.setEnabled(True)
        
    def maj(self):
        self.voitureEnCours = -1
        self.questionsTerminees = False
        self.typePaiementRenseigne = False
        self.accesEnCours = randint(1,2)
        self.ui1.nbVoitures.display(self.ctrlPark.getParking().getNbPlacesLibres())
        self.ui1.listeVoitures.clear()
        self.ui1.boutonReprendreVoiture.setEnabled(False)
        self.ui1.boutonInfos.setEnabled(False)
        self.ui1.boutonDeselect.setEnabled(False)
        for voiture in self.ctrlPark.getListeVoitures():
            self.ui1.listeVoitures.addItem(voiture.__str__())
        
        # pour tester 
        '''self.ui4.lineEditPrenom.setText("Michel")
        self.ui4.lineEditNom.setText("Durand")
        self.ui4.plainTextEditAdresse.setPlainText("3 avenue du bresil")
        self.ui4.lineEditMail.setText("mich_mich@orange.fr")
        self.ui4.lineEditTel.setText("0468756432")'''
        
        self.effacerChampsClient()
        self.ui3.lineEditNumImma.setText("")
    
    def deselect(self):
        self.ui1.listeVoitures.clearSelection()
        self.ui1.listeVoitures.clearFocus()
        self.maj()
        
    def garerVoiture(self):
        if self.voitureEnCours == -1 :
            self.dderImmatriculation()
        else :
            client = self.ctrlPark.getVoiture(self.voitureEnCours).getProprietaire()
            if not client.getEstAbonne() and not self.questionsTerminees :
                self.dderAbonnement()
            elif not client.getEstSuperAbonne() and not self.questionsTerminees :
                self.dderSuperAbo()
            elif not self.typePaiementRenseigne :
                self.dderTypePaiement()          
            else :
                self.ctrlPark.getVoiture(self.voitureEnCours).demanderPlacement(self.ctrlPark.getAcces(self.accesEnCours), self.ctrlPark.bdd)
                self.maj()
    
    def sortirVoiture(self):
        if self.voitureEnCours == -1 :
            print("Selectionner une voiture")
        else :
            if self.ctrlPark.getVoiture(self.voitureEnCours).getEstGaree() :
                self.fenPayer.close()
                self.fenMerci.show()
            self.ctrlPark.getVoiture(self.voitureEnCours).demanderSortie(self.ctrlPark.getAcces(self.accesEnCours), self.ctrlPark.bdd)
            self.maj()        
    
    def dderImmatriculation(self):
        self.fenDdeImmat.show()
        
    def addVoiture(self):
        immatSaisie = self.ui3.lineEditNumImma.text()
        if self.ctrlPark.immatExiste(immatSaisie) :
            self.voitureEnCours = self.ctrlPark.getVoitureParImmat(immatSaisie)
            self.garerVoiture() 
        else :    
            self.ctrlPark.addVoitureDansListe(immatSaisie)
            self.voitureEnCours = len(self.ctrlPark.getListeVoitures())-1
            self.fenAjoutClient.show()
        
        self.fenDdeImmat.close()  
        
    
    def addClient(self):
        prenom = self.ui4.lineEditPrenom.text()
        nom = self.ui4.lineEditNom.text()
        adresse = self.ui4.plainTextEditAdresse.toPlainText()
        mail = self.ui4.lineEditMail.text()
        tel = self.ui4.lineEditTel.text()
        
        self.fenAjoutClient.close()
        self.ctrlPark.assignerProprietaire(self.voitureEnCours, nom, prenom, adresse, mail, tel)
        self.dderAbonnement()
    
    def dderAbonnement(self):
        self.fenDdeAbo.show()
    
    def addAbo(self):
        self.ctrlPark.assignerAbonnementProprietaire(self.ctrlPark.bdd,self.voitureEnCours, True)
        self.fenDdeAbo.close()
        self.dderSuperAbo()
    
    def dderSuperAbo(self):
        self.fenDdeSuperAbo.show()
    
    def addSuperAbo(self):
        self.ctrlPark.assignerSuperAboProprietaire(self.ctrlPark.bdd, self.voitureEnCours, True)
        self.fenDdeSuperAbo.close()
        self.fenInsererCarte.show()
        
    def insererCarte(self):
        self.garerVoiture()
        self.fenInsererCarte.close()
    
    def dderTypePaiement(self):
        voiture = self.ctrlPark.getVoiture(self.voitureEnCours)
        if self.ctrlPark.getParking().peutEtrePlacee(voiture, self.ctrlPark.bdd):
            self.fenChoixPaiement.show()
        else :
            self.typePaiementRenseigne = True
            self.garerVoiture()
    
    def neVeutPasAbo(self):
        self.fenDdeAbo.close()
        self.questionsTerminees = True
        self.garerVoiture()
    
    def neVeutPasSuperAbo(self):
        self.fenDdeSuperAbo.close()
        self.questionsTerminees = True
        self.fenInsererCarte.show()
    
    def infosVoiture(self):
        self.fenInfos.show()
        voiture = self.ctrlPark.getVoiture(self.voitureEnCours)
        long = voiture.getLongueur()
        larg = voiture.getLargeur()
        immat = voiture.getImmatriculation()
        client = voiture.getProprietaire()
        nom = client.getNom()
        prenom = client.getPrenom()
        adresse = client.getAdresse()
        mail = client.getMail()
        tel = client.getTel()
        estAbonne = client.getEstAbonne()
        estSuperAbonne = client.getEstSuperAbonne()
        nbFrequentations = client.getNbFrequentations()
        
        if voiture.getPlacement() and voiture.getEstGaree() :
            typePaiement = voiture.getPlacement().getTypePaiement()
        else :
            typePaiement = 0
        
        self.ui7.zoneLongueur.setText(str(long))
        self.ui7.zoneLargeur.setText(str(larg))
        self.ui7.zoneImma.setText(immat)
        
        self.ui7.zoneNom.setText(nom)
        self.ui7.zonePrenom.setText(prenom)
        self.ui7.zoneAdresse.setText(adresse)
        self.ui7.zoneAdresseMail.setText(mail)
        self.ui7.zoneTel.setText(str(tel))
        
        if estAbonne :
            self.ui7.zoneOffre.setText(client.getAbonnement().getLibelle())
        else :
            self.ui7.zoneOffre.setText("NON ABONNE")
            
        self.ui7.lcdNbFreq.display(nbFrequentations)
        
        if typePaiement == 1 :
            self.ui7.radioButtonCb.setChecked(True)
            self.ui7.radioButtonEspeces.setChecked(False)
        elif typePaiement == 2 :
            self.ui7.radioButtonCb.setChecked(False)
            self.ui7.radioButtonEspeces.setChecked(True)
        else :
            self.ui7.radioButtonCb.setChecked(False)
            self.ui7.radioButtonEspeces.setChecked(False)
                    
     
    def addTypePaiementCb(self):
        self.fenChoixPaiement.close()
        self.typePaiementRenseigne = True
        self.garerVoiture()
        self.ctrlPark.assignerTypePaiement(self.ctrlPark.bdd, self.voitureEnCours, 1)
        
    def addTypePaiementEspeces(self):
        self.fenChoixPaiement.close()
        self.typePaiementRenseigne = True
        self.garerVoiture()
        self.ctrlPark.assignerTypePaiement(self.ctrlPark.bdd, self.voitureEnCours, 2)
    
    def payer(self):
        if self.ctrlPark.getVoiture(self.voitureEnCours).getEstGaree() :
            self.fenPayer.show()
        else :
            self.sortirVoiture()
    
    def ouvrirBdd(self):
        fichier = QtGui.QFileDialog.getOpenFileName(self, 
                     u"Sélectionnez le fichier", 
                     u"bdd.db", 
                     u"Fichier db (*.db);;Tous (*.*)")
 
        if fichier!=u"":
            print (u"fichier demandé : ", fichier)
            self.ctrlPark.bdd.seDeconnecter()
            self.ctrlPark.creerParking(CtrlBdd.CtrlBdd(fichier))
            self.iniFenPrincipale()
        else:
            print (u"aucun fichier demandé")
    
    def reinitialiserBdd(self):
        self.lancementBarreChargement()
        self.ctrlPark.bdd.reinitialisation(self.ctrlPark)
        self.iniFenPrincipale()
        self.barreChargement.stopaction()
    
    def lancementBarreChargement(self):
        self.barreChargement.action()
        print("reinitialisation en cours")
    
    def nouvelleBdd(self):
        self.ctrlPark.bdd.seDeconnecter()
        fichier = QFileDialog.getSaveFileName(
            self, 
           "Créer un fichier", 
           "*.db")
        
        if not fichier:   
            QMessageBox.critical(self, 
               self.trUtf8("Erreur nom saisi"),
               self.trUtf8("Veuillez saisir un nom valide"))
            print ("erreur enregistrement")
        else :
            QMessageBox.information(self, 
                    self.trUtf8("Nom correct"), 
                    self.trUtf8("Fichier correctement créé"))
                           
            print ("fichier créé :", fichier)
            self.ctrlPark.bdd = CtrlBdd.CtrlBdd(fichier)
            self.reinitialiserBdd()
            
        
    def effacerChampsClient(self):
        self.ui4.lineEditPrenom.setText("")
        self.ui4.lineEditNom.setText("")
        self.ui4.plainTextEditAdresse.setPlainText("")
        self.ui4.lineEditMail.setText("")
        self.ui4.lineEditTel.setText("")
    
    def renseignerVersion(self):
        QMessageBox.information(self, 
                    self.trUtf8("Version"), 
                    self.trUtf8("DreamPark Version 1.2"))
    
    def renseignerDreamPark(self):
         QMessageBox.information(self, 
                    self.trUtf8("DreamPark"), 
                    self.trUtf8("DreamPark le parking du futur, implémenté par Torond Damien et Sentost Geoffrey"))
         
        
    def ouvrirStats(self):
        self.fenStat.show()
        self.actualiserFreq()
        
    def actualiserFreq(self):
        liste = self.ctrlPark.bdd.getInfosFrequentations()
        self.ui8.tableWidget.setColumnCount(4)
        self.ui8.tableWidget.setRowCount(len(liste))
        
        listeLabels = ["nom", "prenom", "abonnement", "nbFrequentations"]
        self.ui8.tableWidget.setHorizontalHeaderLabels(listeLabels)
        
        cptAbo = self.ctrlPark.bdd.getNbAbo()
        cptSuperAbo = self.ctrlPark.bdd.getNbSuperAbo()
        cptNonAbo = self.ctrlPark.bdd.getNonAbo()
        
        for i, row in enumerate(liste):
            for j, col in enumerate(row):
                item = QTableWidgetItem(str(col))
                self.ui8.tableWidget.setItem(i, j, item)
                    
        self.ui8.textBrowserAbo.setText(str(cptAbo))
        self.ui8.textBrowserSuperAbo.setText(str(cptSuperAbo))
        self.ui8.textBrowserNonAbo.setText(str(cptNonAbo))
        
    def ouvrirContrats(self):
        self.fenContrats.show()
        self.actualiserContrats()
        
    def actualiserContrats(self):
        liste = self.ctrlPark.bdd.getInfosContrats()
        self.ui13.tableWidget.setColumnCount(5)
        self.ui13.tableWidget.setRowCount(len(liste))
        
        listeLabels = ["num", "nom", "abonnement", "dateDebut", "dateFin"]
        self.ui13.tableWidget.setHorizontalHeaderLabels(listeLabels)
        
        for i, row in enumerate(liste):
            for j, col in enumerate(row):
                item = QTableWidgetItem(str(col))
                self.ui13.tableWidget.setItem(i, j, item)
    
    def ouvrirInfosPlacements(self):
        self.fenInfosPlacements.show()
        self.actualiserInfosPlacement()
        
    def infosParking(self):
        self.fenInfosPark.show()
        liste = self.ctrlPark.bdd.getInfosParking()
        self.ui12.tableWidget.setColumnCount(5)
        self.ui12.tableWidget.setRowCount(len(liste))
        
        listeLabels = ["num", "nbNiv", "nbPlaces", "prixPlace", "nbAcces"]
        self.ui12.tableWidget.setHorizontalHeaderLabels(listeLabels)
        
        for i, row in enumerate(liste):
            for j, col in enumerate(row):
                    item = QTableWidgetItem(str(col))
                    self.ui12.tableWidget.setItem(i, j, item)
    
    def actualiserInfosPlacement(self):
        liste = self.ctrlPark.bdd.getInfosPlacement()
        self.ui14.tableWidget.setColumnCount(6)
        self.ui14.tableWidget.setRowCount(len(liste))
        
        listeLabels = ["num", "place", "immatVoiture", "dateEntree", "dateSortie", "typePaiement"]
        self.ui14.tableWidget.setHorizontalHeaderLabels(listeLabels)
        
        for i, row in enumerate(liste):
            for j, col in enumerate(row):
                    item = QTableWidgetItem(str(col))
                    self.ui14.tableWidget.setItem(i, j, item)
    
    def exporterInfosPlacement(self):
        liste = self.ctrlPark.bdd.getInfosPlacement()
        listeLabels = ["num", "place", "immatVoiture", "dateEntree", "dateSortie", "typePaiement"]
        self.creerFichierHtml("statsPlacements.html", listeLabels, liste, "Statistiques : Placements")
        
        QMessageBox.information(self, 
                    self.trUtf8("Export placements"), 
                    self.trUtf8("Exportation des placements réussie !"))
    
    def exporterInfosFrequentations(self):
        liste = self.ctrlPark.bdd.getInfosFrequentations()
        listeLabels = ["nom", "prenom", "abonnement", "nbFrequentations"]
        self.creerFichierHtml("statsFrequentations.html", listeLabels, liste, "Statistiques : Frequentations")
        
        QMessageBox.information(self, 
                    self.trUtf8("Export fréquentations"), 
                    self.trUtf8("Exportation des fréquentations réussie !"))
        
    def exporterInfosContrats(self):
        liste = self.ctrlPark.bdd.getInfosContrats()
        listeLabels = ["num", "nom", "abonnement", "dateDebut", "dateFin"]
        self.creerFichierHtml("statsContrats.html", listeLabels, liste, "Statistiques : Contrats")
        
        QMessageBox.information(self, 
                    self.trUtf8("Export fréquentations"), 
                    self.trUtf8("Exportation des fréquentations réussie !"))
    
    def creerFichierHtml(self, nom, listeLabels, liste, titre):
        fic = open(nom, "w")
        fic.write("<html><head><title>DreamPark : "+titre+"</title></head><body><h1>"+titre+"</h1><table border = '1'><tr>")
        
        for lab in listeLabels :
            fic.write("<th>"+lab+"</th>")
        
        fic.write("</tr>")
            
        for elem in liste :
            fic.write("<tr>")
            for i in elem :
                fic.write("<td>"+str(i)+"</td>")
            fic.write("</tr>")
        
        fic.write("</table></body></html>")
            